package com.zzyl;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@SpringBootTest
public class demo {
    
     @Autowired
    private RedisTemplate<Object,Object> redisTemplate;



 @Test
 public void testString() throws InterruptedException {
        
    //  存数据 set(参数1，参数2，参3) 参1 值，参数2 过期时间，参3 过期单位
    //  取 数据 get(参数1) 

     redisTemplate.boundValueOps("name").set("张三");

     Object name = redisTemplate.boundValueOps("name").get();
     System.out.println("name = " + name);
     
     // 存的时候 设置过期时间 并且设置过期时间的单位为 秒
     redisTemplate.boundValueOps("age").set(18,10, TimeUnit.SECONDS);
     Object age = redisTemplate.boundValueOps("age").get();
     System.out.println("age = " + age);

     // 睡眠11秒
     Thread.sleep(11000);
     


     // 设置不可重复存

     redisTemplate.boundValueOps("name").setIfAbsent("李四");
     name = redisTemplate.boundValueOps("name").get();
     System.out.println("name = " + name);


    redisTemplate.boundValueOps("name1").setIfAbsent("lisi");
     Object name1 = redisTemplate.boundValueOps("name1").get();
     System.out.println("name1 = " + name1);


 }

 @Test
 public void testHash(){
     // 向user 集合 中 添加 name 属性 
     redisTemplate.boundHashOps("user").put("name","张三");
    //  从 user集合中 获取name属性
     Object name = redisTemplate.boundHashOps("user").get("name");
     System.out.println("o = " + name);
     
    // 删除user集合中的name 属性
     Long delete = redisTemplate.boundHashOps("user").delete("name"); // 操作成功删除的个数，失败返回0
     System.out.println("delete = " + delete);

   //  从新向 user集合中 添加数据,添加相同的key 字段，会发生覆盖，后面添加的会覆盖之前添加的
     redisTemplate.boundHashOps("user").put("name","lisi");
     redisTemplate.boundHashOps("user").put("name","zhangSan");
     redisTemplate.boundHashOps("user").put("age",20);

 //     获取list 集合中的 所有key
     Set<Object> keys = redisTemplate.boundHashOps("user").keys();
     System.out.println("keys = " + keys);
 //     获取 user集合中的 key 对应的 所有value
     List<Object> values = redisTemplate.boundHashOps("user").values();
     System.out.println("user = " + values);



 }

 @Test
 public void testList(){
    //  向list 列表前面添加数据
    redisTemplate.boundListOps("myList").leftPush("1");
    redisTemplate.boundListOps("myList").leftPush("2");
 //    向list 列表末尾添加数据
     redisTemplate.boundListOps("myList").rightPush("3");

 //     查看list 列表的长度
     Long myListLength = redisTemplate.boundListOps("myList").size();
     System.out.println("myListLength = " + myListLength);

 //     取出list 中 的 内容  range(起始索引，结束索引) 若起始索引是 0 ，结束索引是-1 则返回全部
     List<Object> myList = redisTemplate.boundListOps("myList").range(0, -1);
     System.out.println("全部数据 = " + myList);
     List<Object> myList1 = redisTemplate.boundListOps("myList").range(0, 1);
     System.out.println("myList1 = " + myList1); // 2，1

 //     删除list 列表中的某个内容

     // 1.从头删除
     Object myList2 = redisTemplate.boundListOps("myList").leftPop();
     System.out.println("从头删除的数据 = " + myList2); // 2

 //     2.从尾部删除
     Object myList3 = redisTemplate.boundListOps("myList").rightPop();
     System.out.println("从尾部删除的数据 = " + myList3); // 3



 }

 @Test
 public void testSet(){

     // 向set类型的列表中 存数据，相同的数据无法存进去
     redisTemplate.boundSetOps("mySet").add("a","b","c","d","a");
 //     从 set类型的列表中 取出全部数据
     Set<Object> mySet = redisTemplate.boundSetOps("mySet").members();
     System.out.println("全部数据 = " + mySet);

 //     获取set 类型 列表的长度size()
     Long size = redisTemplate.boundSetOps("mySet").size();
     System.out.println("长度 = " + size);

 //     创建另一个set 类型的列表
     Long add = redisTemplate.boundSetOps("mySet2").add("a", "e", "f");
     System.out.println("add = " + add);

 //    算出两个set 列表的交集
     Set<Object> intersect = redisTemplate.boundSetOps("mySet").intersect("mySet2");
     System.out.println("交集 = " + intersect);
 //     算出两个set 列表的并集
     Set<Object> union = redisTemplate.boundSetOps("mySet").union("mySet2");
     System.out.println("并集 = " + union);



 }

 @Test
 public void  testZset(){

     // 向zset 列表中 添加数据
     redisTemplate.boundZSetOps("myZest").add("zhangSan",10);
     redisTemplate.boundZSetOps("myZest").add("lisi",20);
     redisTemplate.boundZSetOps("myZest").add("wangWu",15);
     
 //     从zset 列表中 取出某个范围的值 range(起始索引，结束索引)，起始索引为0，结束索引为-1 是取全部，默认是升序
     Set<Object> myZest = redisTemplate.boundZSetOps("myZest").range(0, -1);
     System.out.println("全部数据 = " + myZest);

     Set<Object> myZest1 = redisTemplate.boundZSetOps("myZest").range(0, 1);
     System.out.println("索引0，1之间的数据 = " + myZest1);

     Set<Object> myZest3 = redisTemplate.boundZSetOps("myZest").reverseRange(0, -1);
     System.out.println("降序 = " + myZest3);

     // 增加某个字段的 score分值
     // wangWu加30分
     System.out.println(redisTemplate.boundZSetOps("myZest").incrementScore("wangWu", 30));
     // wangWu加50分
     System.out.println(redisTemplate.boundZSetOps("myZest").incrementScore("wangWu", 50));


     //     从zset 列表中 取出数据，并带上 score值 rangeWithScores(起始索引，结束索引) 起始索引为0，结束索引为-1 是取全部
     Set<ZSetOperations.TypedTuple<Object>> myZest2 = redisTemplate.boundZSetOps("myZest").rangeWithScores(0, -1);
     System.out.println("全部数据2 = " + myZest2);

     for (ZSetOperations.TypedTuple<Object> objectTypedTuple : myZest2) {
         System.out.println("objectTypedTuple.getValue()+objectTypedTuple.getScore() = " + objectTypedTuple.getValue()+objectTypedTuple.getScore());
     }

 }

 @Test
 public void testCommon(){
     // 通用命令：获取 redis中的 所有key
     Set<Object> keys = redisTemplate.keys("*");
     System.out.println("keys = " + keys);
     for (Object key : keys) {
         System.out.println("key = " + key);
     }

 //     2,获取某个属性key
     Boolean user1 = redisTemplate.hasKey("user1");
     Boolean user = redisTemplate.hasKey("user");
     System.out.println("获取某个user = " + user);
     System.out.println("获取某个user1 = " + user1);

 //     3. 判断某个字段的属性类型
     DataType user2 = redisTemplate.type("user");
     System.out.println("user2 = " + user2);
     DataType name = redisTemplate.type("name");
     System.out.println("name = " + name);
     DataType myList = redisTemplate.type("myList");
     System.out.println("myList = " + myList);
     DataType mySet = redisTemplate.type("mySet");
     System.out.println("mySet = " + mySet);
     DataType myZest = redisTemplate.type("myZest");
     System.out.println("myZest = " + myZest);
     
 //     删除某个字段属性key
     Boolean name1 = redisTemplate.delete("name");
     System.out.println("name1 = " + name1);
     

 }
}


